#include <linux/module.h>
#include <linux/init.h>

#include <linux/kobject.h>
#include <linux/printk.h>
#include <linux/slab.h>

#include "linux/device.h"

struct kobject *p;
struct kset *mykset;

void release(struct kobject *kobj)
{
    printk("kobject: (%p): %s\n", kobj, __func__);
    kfree(kobj);
}

int __init my_kobject_init(void)
{
    // int ret;
    p = kobject_create_and_add("Kobject1", NULL);
    kobject_create_and_add("Kobject2", p);
    kobject_create_and_add("Kobject3", p);
    // kref_init(p->kref);
    p->ktype->release = release;
    printk("计数器值为%d\n", p->kref.refcount.refs.counter);

    // if (!p)
    //     pr_err("Kobj1创建失败!");
    // pr_err("Kobj1创建成功!");

    // p1 = kobject_create_and_add("Kobject2", p);
    // if (!p1)
    //     pr_err("Kobj2建失败!");
    // pr_err("Kobj2创建成功!");

    // p2 = kobject_create_and_add("Kobject3", p1);
    // if (!p2)
    //     pr_err("Kobj3创建失败!");
    // pr_err("Kobj3创建成功!");

    // p4= kzalloc(sizeof(struct kobject),GFP_KERNEL);
    // if(!kobject_init_and_add(p4,&ktype,NULL,"%s","Kobject4")){
    //     pr_err("Kobj4创建失败!");
    // }
    // int ret;

    // mykset = kset_create_and_add("my_kset", NULL, NULL);

    // p = kzalloc(sizeof(struct kobject), GFP_KERNEL);
    // p1 = kzalloc(sizeof(struct kobject), GFP_KERNEL);
    // p->kset = mykset;
    // p1->kset = mykset;
    // ret = kobject_init_and_add(p, &ktype, NULL,"%s", "kobj1");
    // ret = kobject_init_and_add(p1, &ktype, NULL,"%s", "kobj2");

    return 0;
}
void __exit my_kobject_exit(void)
{
    kobject_put(p);
    // kobject_put(p1);
    // kset_unregister(mykset);
}

module_init(my_kobject_init);
module_exit(my_kobject_exit);
MODULE_AUTHOR("LYH");
MODULE_LICENSE("GPL v2");